#include <app.h>
#include <u_syscall.h>
#include <list.h>
#include <memory.h>
#include <shell.h>

APP_INFO appInfo[MAX_APP_NUM] = {0};
U16 appNum = 0;

E_RET AppRegister(APP_FUNC pFunc, U08* stackAddr, U16 stackSize, U08* name, E_APP_PRI priority)
{
    if(appNum >= MAX_APP_NUM)
        return E_ERR;

    appInfo[appNum].pfunc = pFunc;
    appInfo[appNum].stackAddr = stackAddr;
    appInfo[appNum].stackSize = stackSize;
    appInfo[appNum].name = name;
    appInfo[appNum].priority = priority;
    appNum++;

    return E_OK;
}

/******************************************************************************
* 函数名称: static void TaskIdleFunc(void)
* 功能说明: 空闲任务
* 输入参数: 无
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
#define IDLE_STACK_SIZE   512     
static U08 taskIdle_stack[IDLE_STACK_SIZE];    // 空闲任务私有栈
static void TaskIdleFunc(void)                 // 空闲任务执行函数
{
    while(1);
}

U08 AppHeap[4096] = {0xff}; // 用户程序堆区

void Delay(U32 cnt)
{
    volatile U32 cnt_t = cnt; 
    while(cnt_t--);
}

U32 testBuf[200];
void FsTest(void)
{
    for(U32 i = 0; i < sizeof(testBuf) / sizeof(testBuf[0]); i++)
        testBuf[i] = i;

    print("creat:%d\n", CreatFileInRoot("1.txt"));
    U32 fd = FileOpen("1.txt");

    // 将 testBuf 缓冲区中数据写入文件
    print("write:%d\n", FileWrite(fd, (U08 *)testBuf, sizeof(testBuf)));
    FileClose(fd);

    // 清 testBuf 缓冲区
    for(U32 i = 0; i < sizeof(testBuf) / sizeof(testBuf[0]); i++)
        testBuf[i] = 0;
    
    // 重新打开文件
    fd = FileOpen("1.txt");

    // 设置文件读写指针位置
    FileSeek(fd, 100);

    // 打印当前文件读写指针位置
    print("FileTell:%d\n", FileTell(fd));

    // print("Read:%d\n", FileRead(fd, (U08 *)testBuf, 2000));
    // print("Read:%d\n", FileRead(fd, (U08 *)testBuf, 800));
    print("Read:%d\n", FileRead(fd, (U08 *)testBuf, sizeof(testBuf)));

    for(U32 i = 0; i < sizeof(testBuf) / sizeof(testBuf[0]); i++)
        print("%d ", testBuf[i]);

    FileClose(fd);
}

static U08 TaskAStack[512];
static void TaskA(void)
{
    SetCursorPos(0, 9);
    FsTest();
}

void AppInit(void)
{
    MemInit((U08 *)&AppHeap, 4096);

    AppRegister(ShellTask, ShellStack, sizeof(ShellStack), "Shell", E_APP_PRI0);
    AppRegister(TaskA, TaskAStack, sizeof(TaskAStack), "TaskA", E_APP_PRI0);

    // 把应用数据放入共享内存 0xA800 处
    *((volatile U32*)0xA800) = (U32)appInfo;
    *((volatile U32*)0xA804) = appNum;
    *((volatile U32*)0xA808) = (U32)taskIdle_stack;
    *((volatile U32*)0xA80C) = IDLE_STACK_SIZE;
    *((volatile U32*)0xA810) = (U32)TaskIdleFunc;
}
